const fs = require('fs');
const path = require('path');

/**
 * 简单的日志工具
 */
class Logger {
  constructor(logDir = null) {
    this.logDir = logDir || path.join(__dirname, '../storage');
    this.ensureLogDirectory();
  }

  /**
   * 确保日志目录存在
   */
  ensureLogDirectory() {
    if (!fs.existsSync(this.logDir)) {
      fs.mkdirSync(this.logDir, { recursive: true });
    }
  }

  /**
   * 格式化日志消息
   * @param {string} level - 日志级别
   * @param {string} message - 日志消息
   * @param {Object} data - 附加数据
   * @returns {string}
   */
  formatMessage(level, message, data = null) {
    const timestamp = new Date().toISOString();
    const logEntry = {
      timestamp,
      level: level.toUpperCase(),
      message,
      ...(data && { data })
    };
    return JSON.stringify(logEntry);
  }

  /**
   * 写入日志文件
   * @param {string} filename - 文件名
   * @param {string} message - 日志消息
   */
  writeToFile(filename, message) {
    try {
      const logFile = path.join(this.logDir, filename);
      fs.appendFileSync(logFile, message + '\n');
    } catch (error) {
      console.error('写入日志文件失败:', error.message);
    }
  }

  /**
   * 记录信息日志
   * @param {string} message - 日志消息
   * @param {Object} data - 附加数据
   */
  info(message, data = null) {
    const logMessage = this.formatMessage('info', message, data);
    console.log(`ℹ️  ${message}`);
    this.writeToFile('app.log', logMessage);
  }

  /**
   * 记录错误日志
   * @param {string} message - 日志消息
   * @param {Object} data - 附加数据
   */
  error(message, data = null) {
    const logMessage = this.formatMessage('error', message, data);
    console.error(`❌ ${message}`);
    this.writeToFile('error.log', logMessage);
    this.writeToFile('app.log', logMessage);
  }

  /**
   * 记录警告日志
   * @param {string} message - 日志消息
   * @param {Object} data - 附加数据
   */
  warn(message, data = null) {
    const logMessage = this.formatMessage('warn', message, data);
    console.warn(`⚠️  ${message}`);
    this.writeToFile('app.log', logMessage);
  }

  /**
   * 记录调试日志
   * @param {string} message - 日志消息
   * @param {Object} data - 附加数据
   */
  debug(message, data = null) {
    if (process.env.NODE_ENV === 'development') {
      const logMessage = this.formatMessage('debug', message, data);
      console.log(`🐛 ${message}`);
      this.writeToFile('debug.log', logMessage);
    }
  }

  /**
   * 记录下载相关日志
   * @param {string} message - 日志消息
   * @param {Object} data - 附加数据
   */
  download(message, data = null) {
    const logMessage = this.formatMessage('download', message, data);
    console.log(`📥 ${message}`);
    this.writeToFile('download.log', logMessage);
    this.writeToFile('app.log', logMessage);
  }

  /**
   * 清理旧日志文件
   * @param {number} maxAge - 最大保留天数
   */
  cleanupLogs(maxAge = 30) {
    try {
      const files = fs.readdirSync(this.logDir);
      const cutoffDate = new Date();
      cutoffDate.setDate(cutoffDate.getDate() - maxAge);

      let cleaned = 0;
      for (const file of files) {
        if (file.endsWith('.log')) {
          const filePath = path.join(this.logDir, file);
          const stats = fs.statSync(filePath);

          if (stats.mtime < cutoffDate) {
            fs.unlinkSync(filePath);
            cleaned++;
          }
        }
      }

      if (cleaned > 0) {
        this.info(`清理了 ${cleaned} 个旧日志文件`);
      }
    } catch (error) {
      this.error('清理日志文件失败', { error: error.message });
    }
  }
}

// 创建全局日志实例
const logger = new Logger();

module.exports = logger;
